﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;

namespace Dye_Lib
{
    [Serializable]
    public class Diagram
    {
        // een diagram heeft ook zijn tab naam nodig ;)
        private string naam;

        public string Naam
        {
            get { return naam; }
            set { naam = value; }
        }

        private Rectangle afmeting;

        public Rectangle Afmeting
        {
            get { return afmeting; }
            set { afmeting = value; }
        }
        private List<Component> componenten;

        public List<Component> Componenten
        {
            get { return componenten; }
            set { componenten = value; }
        }
        private DiagramType type;

        public Diagram(DiagramType type)
        {
            this.type = type;
            this.naam = type.ToString(); // hij krijgt nu standaard zijn naam via het type =)
            componenten = new List<Component>();
        }        

        public void Draw(Graphics g, int offsetX, int offsetY)
        {
            afmeting.Size = Size.Round(g.VisibleClipBounds.Size);
            afmeting.Location = Point.Round(g.VisibleClipBounds.Location);

            for (int i = 0; i < componenten.Count; i++)
            {
                if (componenten[i].Afmeting.X + componenten[i].Afmeting.Width >= -offsetX - componenten[i].Afmeting.Width && componenten[i].Afmeting.X < -offsetX + afmeting.Width
                    && componenten[i].Afmeting.Y >= -offsetY - afmeting.Height && componenten[i].Afmeting.Y - afmeting.Height < -offsetY + afmeting.Height)
                {
                    componenten[i].Draw(g, offsetX, offsetY);
                }
            }
        }

        public void AddKlasse(int newMousePosX, int newMousePosY, string naam)
        {
            componenten.Add(new KlassenDiagramKlasse(newMousePosX, newMousePosY, naam));
        }

        internal Component SelecteerObject(Point point, int screenOffsetX, int screenOffsetY)
        {
            foreach (Component component in componenten)
            {
                component.SelecteerObject(point, screenOffsetX, screenOffsetY);                
            }            
            return componenten.Find(x => x.Selected == true);
            
        }

        internal void VerplaatsObject(Point point)
        {
            foreach (Component component in componenten)
                component.VerplaatsObject(point);   
        }

        internal void PlaatsObject()
        {
            foreach (Component component in componenten)
                component.PlaatsObject();   
        }
    }
}
